﻿using System;
using System.Windows.Controls.Primitives;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Data;
using produccion.clases;
using System.ComponentModel;
using System.IO;
using System.Diagnostics;
using produccion.vistamodelo;
using produccion.reportes;

using System.Security.Principal;//FJRF - Agregada para comprobar la seguridad

namespace produccion.forms
{
    /// <summary>
    /// Lógica de interacción para FrmInventariosFisicos.xaml
    /// </summary>
    public partial class FrmInventariosFisicos : Window
    {
        #region FJRF - EVENTOS PROPIOS DEL SISTEMA
        MDOgeneral MdoGeneral = new MDOgeneral();//FJRF - Traemos toda la informacion y funciones de MdoGeneral

        DataTable DtConsulta;//FJRF - Usamos este DataTable para hacer consultas generales
        DataTable DtConsultaTmp;//FJRF - Usamos este DataTable para hacer consultas temporales
        DataSet DsConsulta;//FJRF - Usamos este DataTable para hacer consultas generales
        String StrConsulta, StrDatoRetornado;//FJRF - Usamos este DataTable para hacer consultas generales

        DateTime DttFecha;//FJRF - Variable para el manejo de la fecha
        String StrRutaReporteCrystalReport = @"reportes\";//FJRF - Esta es la ruta de los reportes de crystal reports
        public FrmInventariosFisicos()
        {
            InitializeComponent();//FJRF - Se inicializan todos los componentes
        }
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            string strTituloVentana = "INVENTARIOS FÍSICOS" + " - Usuario:" + MDOgeneral.usuario + " - [FrmInventariosFisicos]";//FJRF - Armamos el nombre de la ventana
            Title = strTituloVentana;//FJRF - Asignamos el nombre de la ventana

            #region FJRF - CargamosLosGrupos
            StrConsulta = "SELECT CODGRP_GRP, NOMGRP_GRP FROM MAEGRP ORDER BY NOMGRP_GRP";//FJRF - Creamos la consulta que traera la informacion de los grupos ordenamos por nombre
            CargarCombo(CboCodigoGrupo, StrConsulta, "CODGRP_GRP", "CODGRP_GRP", "Codigo");//FJRF - Cargamos solo el codigo del grupo

            StrConsulta = "SELECT CODGRP_GRP, NOMGRP_GRP FROM MAEGRP ORDER BY NOMGRP_GRP";//FJRF - Creamos la consulta que traera la informacion de los grupos ordenamos por nombre
            CargarCombo(CboNombreGrupo, StrConsulta, "CODGRP_GRP", "NOMGRP_GRP", "Nombre");//FJRF - Cargamos solo el nombre del grupo

            CboCodigoSubGrupo.Visibility = Visibility.Visible;//FJRF - Ponemos invisible el sub grupo para obligar a seleccionar primero un grupo
            #endregion

            DttFecha = DateTime.Now;//FJRF - Asignamos la fecha actual
            StrConsulta = MdoGeneral.StrRetornarUnSoloCampo("FECHA_RIV", "FECHA", "RESINVP", "FECHA_RIV = TO_DATE('" + DttFecha.ToShortDateString() + "', 'dd/mm/yyyy') GROUP BY FECHA_RIV ");
            if (StrConsulta == "DATO NO ENCONTRADO")
            {
                PttV_EjecutarProcesosDeInicio();//FJRF - En estas seccion cargamos y ejecutamos todos los procesos necesarios en este formulario
            }
            else
            {
                Msgbox("PROCESO FINALIZADO", "Ya se realizo un inventario el día de hoy", MessageBoxButton.OK, MessageBoxImage.Information);//FJRF - Creamos un mensaje para el usuario
                this.Close();//FJRF - Cerramos la ventana actual
            }
        }
        private void CboCodigoGrupo_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (CboCodigoSubGrupo.Visibility == Visibility.Visible)
            {
                CboNombreGrupo.SelectedIndex = CboCodigoGrupo.SelectedIndex;
                PttV_BuscarSubGrupo(CboCodigoGrupo.SelectedValue.ToString());
            }
        }
        private void CboNombreGrupo_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (CboCodigoSubGrupo.Visibility == Visibility.Visible)
            {
                CboCodigoGrupo.SelectedIndex = CboNombreGrupo.SelectedIndex;
                PttV_BuscarSubGrupo(CboCodigoGrupo.SelectedValue.ToString());
            }
        }
        private void CboCodigoSubGrupo_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            CboNombreSubGrupo.SelectedIndex = CboCodigoSubGrupo.SelectedIndex;
        }
        private void CboNombreSubGrupo_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            CboCodigoSubGrupo.SelectedIndex = CboNombreSubGrupo.SelectedIndex;
        }
        private void btnSalir_Click(object sender, RoutedEventArgs e)
        {
            this.Close();//FJRF - Cerramos la ventana actual
        }
        private void BtnGuardar_Click(object sender, RoutedEventArgs e)
        {
            PttV_Guardar();
        }
        private void BtnFisicoVsTeoricoPrueba_Click(object sender, RoutedEventArgs e)
        {
            PttV_EjecutarFisicoVsTeoricoPrueba();
        }
        private void BtnFisicoVsTeoricoDefinitivo_Click(object sender, RoutedEventArgs e)
        {
            String StrCaptionBox = "Confirmation";
            String StrMensajeBox = "Este proceso es irreversible y se encarga de dejar definitiva la toma física en el sistema… ¿Desea continuar?";
            MessageBoxButton buttons = MessageBoxButton.YesNo;
            MessageBoxImage icon = MessageBoxImage.Question;

            if (MessageBox.Show(StrMensajeBox, StrCaptionBox, buttons, icon) == MessageBoxResult.Yes)//FJRF - Evaluamos la respuesta del usuario y su es positiva hacemos lo siguiente
            {
                try
                {
                    Mouse.OverrideCursor = Cursors.Wait;//FJRF - Pone el cursor en modo de espera

                    CboCodigoGrupo.SelectedValue = "ZZZ999";//FJRF - Ponemos el combo en la primera posicion (Para poder procesar todos los datos)
                    CboCodigoSubGrupo.SelectedValue = "ZZZ999";//FJRF - Ponemos el combo en la primera posicion (Para poder procesar todos los datos)
                    PttV_EjecutarProcesar();//FJRF - Ejecutamos el proceso de consultar

                    //FJRF - 1. CREAMOS UN REGISTRO EN LA TABLA [RESINVP] PARA CADA MATERIA PRIMA CON LA FECHA DEL INVENTARIO
                    #region FJRF - CreamosHistorialAveriguandoElCostoPorCadaProducto
                    String StrCodigoMaterial, StrCodigoColor, StrCantidadFisica, StrCantidadTeorica;//FJRF - Creamos la variables que usaremos
                    Int32 IntCantidadRegistros = 0;//FJRF - Para saber la cantidad de registros que se actualizaron

                    DttFecha = DateTime.Now;//FJRF - Asignamos la fecha actual

                    for (int IntFilaActual = 0; IntFilaActual < DtConsulta.Rows.Count; IntFilaActual++)//FJRF - Recorremos la informacion encontrada
                    {
                        StrCantidadFisica = DtConsulta.Rows[IntFilaActual][12].ToString().Replace(",",".");//FJRF - Extraemos el la cantidad digitada
                        StrCantidadTeorica = DtConsulta.Rows[IntFilaActual][10].ToString().Replace(",", ".");//FJRF - Extraemos el la cantidad existente en este caso teorica

                        if (String.IsNullOrEmpty(StrCantidadFisica) == true)//FJRF - Validamos que la cantidad digitada tenga datos y si no tiene hacemos lo siguiente
                        {
                            StrCantidadFisica = "0";//FJRF - Ponemos la cantidad en cero
                        }
                        if (String.IsNullOrEmpty(StrCantidadTeorica) == true)//FJRF - Validamos que la cantidad digitada tenga datos y si no tiene hacemos lo siguiente
                        {
                            StrCantidadTeorica = "0";//FJRF - Ponemos la cantidad en cero
                        }

                        StrCodigoMaterial = DtConsulta.Rows[IntFilaActual][1].ToString();//FJRF - Extraemos el material
                        StrCodigoColor = DtConsulta.Rows[IntFilaActual][3].ToString();//FJRF - Extraemos el color

                        #region FJRF - AveriguamosElCosto
                        Double DblCosto;

                        DtConsultaTmp = new DataTable();
                        StrConsulta = "SELECT VALOR_PMP AS COSTO FROM PREMTPP WHERE CODLIS_PMP = '00' AND CODMAT_PMP = '" + StrCodigoMaterial + "' AND CODCOL_PMP = '" + StrCodigoColor + "'";
                        DtConsultaTmp = MdoGeneral.consulta(StrConsulta);

                        if (DtConsultaTmp.Rows.Count > 0)
                        {
                            DblCosto = Double.Parse(DtConsultaTmp.Rows[0][0].ToString().Replace(",","."));
                        }
                        else
                        {
                            DblCosto = 0;
                        }
                        #endregion

                        StrConsulta = "INSERT INTO RESINVP (FECHA_RIV,  CODMAT_RIV,  CODCOL_RIV,  CANFIS_RIV,  CANTEO_RIV,  COSUNI_RIV) VALUES ('" + DttFecha.ToShortDateString() + "','" + StrCodigoMaterial + "','" + StrCodigoColor + "','" + StrCantidadFisica + "','" + StrCantidadTeorica + "','" + DblCosto + "')";//FJRF - Actualizamos el inventario fisico
                        MdoGeneral.comando(StrConsulta);//FJRF - Ejecutamos la consulta

                        IntCantidadRegistros++;//FJRF - Incrementamos el contador
                    }
                    #endregion

                    //FJRF - 2. HACEMOS QUE EL DATO FISICO SEA IGUAL AL DE LA EXISTENCIA PUES ESTE DATO YA LO TENEMOS GUARDADO
                    StrConsulta = "UPDATE MAEMTP SET EXIMTP_MTP = FISICO_MTP";//FJRF - Igualamos el fisico con la existencia
                    MdoGeneral.comando(StrConsulta);//FJRF - Ejecutamos la consulta

                    //FJRF - 3. ELIMINAMOS DE LA TABLA CONTROL EL REGISTRO QUE CONTROLA UN INVENTARIO EN PROCESO
                    StrConsulta = "DELETE FROM CONTROLP WHERE ID_CON = 'INV' AND COD_CON = 'FIS' ";//FJRF - Creamos la consulta que eliminara el registro
                    MdoGeneral.comando(StrConsulta);//FJRF - Ejecutamos la consulta

                    //FJRF - 4. GERERA EL MISMO INFORME QUE EN INVENTARIO FISICO VS TEORICO
                    PttV_EjecutarImprimir("rptInformeInventarioFisicoVsTeorico.rpt");

                    Mouse.OverrideCursor = Cursors.Arrow;//FJRF - Pone el cursor de forma normal antes del mensaje

                    //FJRF - 5. INFORMAMOS EL FIN DEL PROCESO Y NOS SALIMOS
                    Msgbox("PROCESO FINALIZADO", "Se actualizaron [" + IntCantidadRegistros + "] registros", MessageBoxButton.OK, MessageBoxImage.Information);

                    this.Close();//FJRF - Cerramos la ventana actual
                }
                catch (Exception ex)//FJRF - En caso de presentarce un problema hacemos lo siguiente
                {
                    Mouse.OverrideCursor = Cursors.Arrow;//FJRF - Pone el cursor de forma normal
                    MessageBox.Show(ex.Message);//FJRF - Enviamos el mensaje de error
                    this.Close();//FJRF - Cerramos la ventana actual
                }
            }
            else//FJRF - Si la respuesta del usuario es negativa hacemos lo siguiente
            {
                MessageBoxResult result = MessageBox.Show("No se ejecuto la carga de toma física en el sistema", "PROCESO CANCELADO");//FJRF - Enviamos un mensaje informando que se cancelo el proceso
            }
        }
        private void BtnImprimir_Click(object sender, RoutedEventArgs e)
        {
            PttV_EjecutarProcesar();//FJRF - Ejecutamos el proceso de consultar
            PttV_EjecutarImprimir("rptInformeInventarioFisicoEnBlanco.rpt");
        }
        private void BtnProcesar_Click(object sender, RoutedEventArgs e)
        {
            PttV_EjecutarProcesar();
        }
        #endregion

        #region FJRF - PROCEDIMIENTOS Y FUNCIONES
        protected void PttV_Guardar()
        {
            String StrCodigoMaterial, StrCodigoColor, StrCantidadFisica;//FJRF - Creamos la variables que usaremos

            Msgbox("INICIANDO PROCESO", "Este proceso puede tardar unos segundos, precione aceptar y por favor espere...", MessageBoxButton.OK, MessageBoxImage.Information);

            Mouse.OverrideCursor = Cursors.Wait;//FJRF - Pone el cursor en modo de espera

            for (int IntFilaActual = 0; IntFilaActual < DtConsulta.Rows.Count; IntFilaActual++)//FJRF - Recorremos la informacion encontrada
            {
                StrCantidadFisica = DtConsulta.Rows[IntFilaActual][12].ToString();//FJRF - Extraemos el la cantidad digitada

                if (String.IsNullOrEmpty(StrCantidadFisica) == true)//FJRF - Validamos que la cantidad digitada tenga datos y si no tiene hacemos lo siguiente
                {
                    StrCantidadFisica = "0";//FJRF - Ponemos la cantidad en cero
                }

                StrCodigoMaterial = DtConsulta.Rows[IntFilaActual][1].ToString();//FJRF - Extraemos el material
                StrCodigoColor = DtConsulta.Rows[IntFilaActual][3].ToString();//FJRF - Extraemos el color

                if (StrCantidadFisica != "0")//FJRF - Como por defecto el valor viene en cero podemos hacer esta validacion para hacer que el actualizar sea mas rapido actualizando solo valores diferente de cero
                {
                    StrConsulta = "UPDATE MAEMTP SET FISICO_MTP = '" + StrCantidadFisica.Replace(",", ".") + "' WHERE CODMAT_MTP = '" + StrCodigoMaterial + "' AND CODCOL_MTP = '" + StrCodigoColor + "'";//FJRF - Actualizamos el inventario fisico
                    MdoGeneral.comando(StrConsulta);//FJRF - Ejecutamos la consulta
                }
            }
            Mouse.OverrideCursor = Cursors.Arrow;//FJRF - Pone el cursor de forma normal

            Msgbox("PROCESO EJECUTADO CON EXITO", "Se a actualizado el inventario con exito", MessageBoxButton.OK, MessageBoxImage.Information);
        }
        //FJRF - PROCEDIMIENTO PARA DEVOLVER LA CELDA DE UN GRID (SE RECIBE EL GRID LA FILA Y LA COLUMNA A CONSULTAR)
        private string ReturnDataGridCellText(DataGrid Dtg, object ObjItemFila, int IntColumna)
        {
            string strValorRetornado = "";//FJRF - Limpiamos el valor a retornar

            DataGridRow row = (DataGridRow)Dtg.ItemContainerGenerator.ContainerFromItem(ObjItemFila);//FJRF - Miramos cual es la fila a consultar
            TextBlock cellContent = Dtg.Columns[IntColumna].GetCellContent(row) as TextBlock;//FJRF - Enviamos el dato de la fila y la columna para tener el dato de la celda

            strValorRetornado = cellContent.Text;//FJRF - Retornamos el valor de la celda solo el texto

            return strValorRetornado.Trim();//FJRF - Retornamos el valor sin espacion
        }
        protected void PttV_EjecutarProcesosDeInicio()
        {
            StrDatoRetornado = MdoGeneral.StrRetornarUnSoloCampo("NOM_CON", "FECHA", "CONTROLP", "ID_CON = 'INV' AND COD_CON = 'FIS'");//FJRF - Buscamos si existe un inventario fisico
            if (StrDatoRetornado == "DATO NO ENCONTRADO")//FJRF - Verificamos que exista algun dato
            {
                String StrCaptionBox = "Confirmation";
                String StrMensajeBox = "Este proceso iniciara la información para la toma física de inventario… ¿Desea continuar?";
                MessageBoxButton buttons = MessageBoxButton.YesNo;
                MessageBoxImage icon = MessageBoxImage.Question;

                if (MessageBox.Show(StrMensajeBox, StrCaptionBox, buttons, icon) == MessageBoxResult.Yes)//FJRF - Evaluamos la respuesta del usuario y su es positiva hacemos lo siguiente
                {
                    try
                    {
                        //FJRF - 1. PONEMOS EL INVENTARIO EN CERO
                        StrConsulta = "UPDATE MAEMTP SET FISICO_MTP = 0";//FJRF - Actualizamos el inventario fisico en cero (0)
                        MdoGeneral.comando(StrConsulta);//FJRF - Ejecutamos la consulta

                        //FJRF - 2. CREAMOS UN REGISTRO INFORMANDO QUE QUE SE PRODUJO UN INVENTARIO FISICO
                        DttFecha = DateTime.Now;//FJRF - Asignamos la fecha actual
                        StrConsulta = "INSERT INTO CONTROLP (ID_CON, COD_CON, NOM_CON, DES_CON) VALUES ('INV', 'FIS', '" + DttFecha.ToShortDateString() + "', '" + DttFecha.ToLongDateString() + "')";//FJRF - Creamos el registro de que se inicia un invientario fisico
                        MdoGeneral.comando(StrConsulta);//FJRF - Ejecutamos la consulta

                        //FJRF - 3. ASIGNAMOS LAS FECHAS DEL INVENTARIO INICIADO
                        LblFechaInventarioIniciado.Content = DttFecha.ToShortDateString();//FJRF - Asignamos la fecha corta
                        LblFechaInventarioIniciado.ToolTip = DttFecha.ToLongDateString();//FJRF - Asignamos la fecha larga
                    }
                    catch (Exception ex)//FJRF - En caso de presentarce un problema hacemos lo siguiente
                    {
                        MessageBox.Show(ex.Message);//FJRF - Enviamos el mensaje de error
                        this.Close();//FJRF - Cerramos la ventana actual
                    }
                }
                else//FJRF - Si la respuesta del usuario es negativa hacemos lo siguiente
                {
                    MessageBoxResult result = MessageBox.Show("Se cerrara automaticamente este formulario", "PROCESO CANCELADO");//FJRF - Enviamos un mensaje informando que se cancelo el proceso
                    this.Close();//FJRF - Cerramos la ventana actual

                }
            }
            else//FJRF - Si encontramos en [ CONTROLP ]un dato hacemos lo siguiente
            {
                //FJRF - ASIGNAMOS LAS FECHAS DEL INVENTARIO QUE ESTA EN CURSO
                LblFechaInventarioIniciado.Content = StrDatoRetornado;//FJRF - Asignamos la fecha corta
                LblFechaInventarioIniciado.ToolTip = MdoGeneral.StrRetornarUnSoloCampo("DES_CON", "FECHALARGA", "CONTROLP", "ID_CON = 'INV' AND COD_CON = 'FIS'");//FJRF - Buscamos si existe un inventario fisico
            }
        }
        protected void PttV_EjecutarFisicoVsTeoricoPrueba()
        {
            PttV_EjecutarProcesar();//FJRF - Ejecutamos el proceso de consultar
            PttV_EjecutarImprimir("rptInformeInventarioFisicoVsTeorico.rpt");
        }
        protected void PttV_EjecutarImprimir(String StrNombreReporteEnCrystalReport)
        {
            produccion.reportes.Vista vista = new produccion.reportes.Vista { ds = DsConsulta, reporte = StrRutaReporteCrystalReport + StrNombreReporteEnCrystalReport };
            vista.Show();
        }
        protected void PttV_EjecutarProcesar()
        {
            Msgbox("INICIANDO PROCESO", "Este proceso puede tardar unos segundos, precione aceptar y por favor espere...", MessageBoxButton.OK, MessageBoxImage.Information);

            Mouse.OverrideCursor = Cursors.Wait;//FJRF - Pone el cursor en modo de espera

            String StrCodigoGrupos, StrCodigoSubGrupos;

            if (CboCodigoGrupo.SelectedValue == null)
            {
                StrCodigoGrupos = "";
            }
            else
            {
                StrCodigoGrupos = CboCodigoGrupo.SelectedValue.ToString();
            }
            if (CboCodigoSubGrupo.SelectedValue == null)
            {
                StrCodigoSubGrupos = "";
            }
            else
            {
                StrCodigoSubGrupos = CboCodigoSubGrupo.SelectedValue.ToString();
            }
            PttV_CargarGridPorGrupoYSubGrupo(StrCodigoGrupos, StrCodigoSubGrupos);
            
            Mouse.OverrideCursor = Cursors.Arrow;//FJRF - Pone el cursor de forma normal
        }
        //FJRF - Con esta funcion cargamos los combos (Cargar combos)
        private Boolean CargarCombo(ComboBox CboComboACargar, string strConsultaOracle, string strSelectedValuePath, string strDisplayMemberPath, string strCodigoONombre)
        {
            Boolean BooSiHayDatos = false;//FJRF - Variable para informar si hay datos o no
            CboComboACargar.ItemsSource = null;
            CboComboACargar.Items.Clear();//FJRF - Borramos los posibles datos que pueda tener el combo

            DtConsulta = new DataTable();//FJRF - Inicializamos la variable
            DsConsulta = new DataSet();//FJRF - Inicializamos la variable

            DtConsulta = MdoGeneral.consulta(strConsultaOracle);//FJRF - Realizamos la consulta y retornamos los datos

            if (DtConsulta.Rows.Count > 0)//FJRF - Si hay datos llenar el combo
            {
                BooSiHayDatos = true;//FJRF - Informamos que hay datos

                DataRow drEncabezado;
                drEncabezado = DtConsulta.NewRow();

                drEncabezado[strSelectedValuePath] = "ZZZ999";

                if (strCodigoONombre.ToUpper().Trim() == "CODIGO")
                {
                    drEncabezado[strDisplayMemberPath] = "ZZZ999";
                }
                if (strCodigoONombre.ToUpper().Trim() == "NOMBRE")
                {
                    drEncabezado[strDisplayMemberPath] = "SELECCIONE UNA OPCIÓN";
                }

                DtConsulta.Rows.Add(drEncabezado);

                DsConsulta.Tables.Add(DtConsulta);//FJRF - Adicionameos el datatable al dataset
                CboComboACargar.ItemsSource = DsConsulta.Tables[0].DefaultView;//FJRF - Cargamos los datos encontrados
                CboComboACargar.SelectedValuePath = strSelectedValuePath;//FJRF - Cargamos la posicion
                CboComboACargar.DisplayMemberPath = strDisplayMemberPath;//FJRF - Decimos cual dato se mostrara

                CboComboACargar.SelectedValue = "ZZZ999";//FJRF - Ponemos el combo en la primera posicion
            }
            return BooSiHayDatos;//FJRF - Avisamos que si hay o no hay datos
        }
        protected void PttV_BuscarSubGrupo(String StrCodigoGrupo)
        {
            if (CboCodigoSubGrupo.Visibility == Visibility.Visible)
            {
                StrConsulta = "SELECT CODGRP_SUB, CODSUB_SUB, NOMSUB_SUB FROM MAESUB WHERE CODGRP_SUB = '" + StrCodigoGrupo + "' ORDER BY NOMSUB_SUB";
                CargarCombo(CboCodigoSubGrupo, StrConsulta, "CODSUB_SUB", "CODSUB_SUB", "Codigo");

                StrConsulta = "SELECT CODGRP_SUB, CODSUB_SUB, NOMSUB_SUB FROM MAESUB WHERE CODGRP_SUB = '" + StrCodigoGrupo + "' ORDER BY NOMSUB_SUB";
                CargarCombo(CboNombreSubGrupo, StrConsulta, "CODSUB_SUB", "NOMSUB_SUB", "Nombre");
            }
        }
        protected void PttV_CargarGridPorGrupoYSubGrupo(String StrCodigoGrupo, String StrCodigoSubGrupo)
        {
            if (StrCodigoGrupo == "ZZZ999" || String.IsNullOrEmpty(StrCodigoGrupo) == true)
            {
                StrCodigoGrupo = "";
            }
            if (StrCodigoSubGrupo == "ZZZ999" || String.IsNullOrEmpty(StrCodigoSubGrupo) == true)
            {
                StrCodigoSubGrupo = "";
            }

            if (StrCodigoGrupo == "" && StrCodigoSubGrupo == "")
            {
                StrConsulta = "SELECT * FROM VIS_MAEMTP ";//FJRF - Cramos la consulta con los parametros enviados
            }
            else
            {
                if (StrCodigoGrupo != "" && StrCodigoSubGrupo == "")
                {
                    StrConsulta = "SELECT * FROM VIS_MAEMTP WHERE CODIGOGRUPO = '" + StrCodigoGrupo + "' ";//FJRF - Cramos la consulta con los parametros enviados
                }
                else
                {
                    StrConsulta = "SELECT * FROM VIS_MAEMTP WHERE CODIGOGRUPO = '" + StrCodigoGrupo + "' AND CODIGOSUBGRUPO = '" + StrCodigoSubGrupo + "' ";//FJRF - Cramos la consulta con los parametros enviados
                }
            }
            DtConsulta = new DataTable("VIS_MAEMTP");

            DtConsulta = MdoGeneral.consulta(StrConsulta);//FJRF - Realizamos la consulta y retornamos los datos
            DtConsulta.TableName = "VIS_MAEMTP";

            if (DtConsulta.Rows.Count > 0)//FJRF - Si hay datos llenar el combo
            {
                DtgInventarioFisico.ItemsSource = DtConsulta.DefaultView;//FJRF - Cargamos los datos en el grid
                DsConsulta = new DataSet("VIS_MAEMTP");
                DsConsulta.Tables.Add(DtConsulta.Copy());//Encabezado Informe 
            }
            else//FJRF - Si no hay datos hacemos lo siguiente
            {
                DtgInventarioFisico.ItemsSource = null;
                DtgInventarioFisico.Items.Clear();
            }
        }
        protected void Msgbox(String StrCaption, String StrMensaje, MessageBoxButton MsbTipoBoton, MessageBoxImage MsbTipoImagenIcono)
        {
            MessageBoxButton buttons;
            buttons = MsbTipoBoton;

            MessageBoxImage icon = MsbTipoImagenIcono;
            MessageBox.Show(StrMensaje, StrCaption, buttons, icon);
        }
        #endregion
    }
}
